iT邦幫忙

2025 iThome 鐵人賽

DAY 24
0
佛心分享-IT 人自學之術

LLM入門學習系列 第 24

Day 24:建立知識向量資料庫 (Knowledge Vector Database)

  • 分享至 

  • xImage
  •  

Day 24:建立知識向量資料庫 (Knowledge Vector Database)

一、學習目標與任務定義

本日學習的核心目標是為 RAG 系統建立檢索基礎。透過將 FAQ 問答知識庫轉換為向量並存入高效能資料庫 FAISS,使 Chatbot 具備「語義檢索」能力。

任務目標 核心技術
資料載入 從結構化 CSV 檔案中讀取 FAQ 資料。
文字向量化 (Embedding) 使用 Sentence-Transformers 將問答內容轉換為高維度語義向量。
建立索引 使用 FAISS 建立高效的向量資料庫索引。
測試與驗證 實作檢索功能,驗證系統能否根據語義找到相似問答。

二、理論核心:Embedding 與 FAISS

(1) 什麼是 Embedding?

Embedding 是一種「文字 $\rightarrow$ 向量」的轉換方式,它將詞彙或句子轉換成高維度的數值向量。其關鍵在於:語義相近的文字,其向量在空間中的距離也越接近。這使得機器可以透過計算向量距離(如餘弦相似度或 L2 距離)來比較語義而非字面相似度。

(2) 什麼是 FAISS?

FAISS (Facebook AI Similarity Search) 是一個專為高效相似度搜索設計的函式庫。在 RAG 架構中,FAISS 用於快速比較用戶查詢向量與知識庫中數百萬、數十億個向量的距離,從而找出最相關的 Top-K 文本片段。


三、實作流程:建立 FAISS 知識庫索引

(1) 環境設置與資料載入

本階段確認安裝必要套件,並載入 Day 23 建立的 faq_data.csv

# Day 24:建立知識向量資料庫

# 安裝必要套件(只需執行一次)
!pip install faiss-cpu sentence-transformers pandas

#載入 FAQ 資料
import pandas as pd

# 假設資料已正確命名為 faq_data.csv
data = pd.read_csv("faq_data.csv") 
print("載入資料筆數:", len(data))
data.head()

https://ithelp.ithome.com.tw/upload/images/20251008/20169488jaTUbG1jFt.png

(2) 文字向量化 (Embedding)

使用 sentence-transformers 模型(選擇 paraphrase-multilingual-MiniLM-L12-v2 適用於多語言語義)將 question 欄位的文本轉換為數值向量。

from sentence_transformers import SentenceTransformer
import numpy as np

model = SentenceTransformer('sentence-transformers/paraphrase-multilingual-MiniLM-L12-v2')
faq_questions = data['question'].tolist()
faq_answers = data['answer'].tolist()

# 將問題轉換成向量
embeddings = model.encode(faq_questions, convert_to_numpy=True)
# 確保向量格式正確
embeddings = embeddings.astype('float32') 
print("向量化完成,維度:", embeddings.shape)

https://ithelp.ithome.com.tw/upload/images/20251008/20169488BGuBAPusOs.png

(3) 建立 FAISS 資料庫索引

初始化 FAISS 索引並將所有向量加入。此處使用 IndexFlatL2,該索引使用 L2 距離(歐幾里得距離)進行搜索。

import faiss

dimension = embeddings.shape[1]  # 取得向量維度
index = faiss.IndexFlatL2(dimension) 
index.add(embeddings)
print("向量資料庫建立完成!")

https://ithelp.ithome.com.tw/upload/images/20251008/20169488XoasCElfjV.png

(4) 測試檢索功能

實作 search 函式,用於將查詢語句向量化,然後使用 FAISS 找到 Top-K 個最相似的問答。

#測試檢索
def search(query, top_k=3):
    query_vec = model.encode([query]).astype('float32') # 查詢向量化
    distances, indices = index.search(query_vec, top_k)
    results = []
    for i, idx in enumerate(indices[0]):
        results.append({
            "rank": i+1,
            "question": faq_questions[idx],
            "answer": faq_answers[idx],
            # 距離(Distance)越小代表越相似
            "distance": round(float(distances[0][i]), 4) 
        })
    return pd.DataFrame(results)

# 範例測試
test_query = "如何建立 Google 帳號?"
print(f"\n測試查詢: {test_query}")
search(test_query)

https://ithelp.ithome.com.tw/upload/images/20251008/20169488R6zb5psWoJ.png

四、今日成果總結

項目 狀態 關鍵技術
知識庫載入 完成 Pandas
語義向量轉換 完成 Sentence-Transformers
向量資料庫建立 完成 FAISS IndexFlatL2
語義檢索驗證 完成 index.search()

本日成功將靜態的 FAQ 資料轉換為動態、可語義檢索的向量資料庫。這一步是 RAG 系統中檢索 (Retrieval) 部分的核心。


上一篇
Day 23:專案初始化與資料收集
下一篇
Day 25:整合檢索與生成模型 (RAG 基礎版)
系列文
LLM入門學習25
圖片
  熱門推薦
圖片
{{ item.channelVendor }} | {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言